package net.atos.java.example.boodschappen.persistence.impl;

import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.Query;

import net.atos.java.example.boodschappen.model.Gebruiker;
import net.atos.java.example.boodschappen.persistence.GebruikerRepository;
import net.atos.java.example.boodschappen.persistence.model.PersistentGebruiker;
import net.atos.java.example.boodschappen.server.persistence.PersistenceHelper;

/**
 * Implementeert een gebruiker repository.
 * 
 * @author Pal Hargitai
 */
public class GebruikerJdoRepository extends
		AbstractJdoRepository<String, Gebruiker, PersistentGebruiker> implements
		GebruikerRepository {

	/** Default constructor. */
	public GebruikerJdoRepository() {
		super(PersistentGebruiker.class);
	}

	/** {@inheritDoc} */
	@Override
	protected PersistentGebruiker convertToPersistent(Gebruiker entity,
			PersistenceManager pm) {
		return new PersistentGebruiker.Builder().gebruiker(entity).build();
	}

	/** {@inheritDoc} */
	@Override
	protected Gebruiker convertToDomain(PersistentGebruiker entity,
			PersistenceManager pm) {
		return new Gebruiker.Builder().pk(entity.getPk())
				.naam(entity.getNaam()).email(entity.getEmail())
				.id(entity.getId()).build();
	}

	/** {@inheritDoc} */
	@Override
	public Gebruiker vindGebruikerPerUserId(String userId) {
		PersistenceManager pm = PersistenceHelper.getPersistenceManager();
		Gebruiker gebruiker;
		try {
			Query query = pm.newQuery(PersistentGebruiker.class);
			query.setFilter("id == idParam");
			query.declareParameters("String idParam");
			@SuppressWarnings("unchecked")
			List<PersistentGebruiker> results = (List<PersistentGebruiker>) query
					.execute(userId);
			if (results.isEmpty()) {
				gebruiker = null;
			} else {
				gebruiker = convertToDomain(results.get(0), pm);
			}
		} finally {
			pm.close();
		}
		return gebruiker;
	}
}
